#include <bits/stdc++.h>
using namespace std;
struct node
{
    int d;
    int v;
    int a;
    int ot;
};
int n;
int m;
int q;
int l;
int v;
int ans;
int ans1;
int cctv[1000005] = {};
node s[1000005] = {};
set <int> used;
inline int len(int d,int v,int a,int sv)
{
    return d + ceil((sv * sv - v * v) * 1.0 / (2 * a));
}
int main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin >> q;
    for(int t = 1;t <= q;t++)
    {
        ans = 0;
        ans1 = 0;
        cin >> n >> m >> l >> v;
        for(int i = 1;i <= n;i++)
        {
            cin >> s[i].d >> s[i].v >> s[i].a;
            s[i].ot = len(s[i].d,s[i].v,s[i].a,v);
        }
        for(int i = 1;i <= m;i++)
            cin >> cctv[i];
        sort(cctv + 1,cctv + m + 1);
        for(int i = 1;i <= n;i++)
        {
            if(s[i].v > v && s[i].a < 0)
            {
                for(int j = 1;j <= m;j++)
                {
                    if(cctv[j] >= s[i].d && cctv[j] <= s[i].ot)
                    {
                        ans++;
                        used.insert(cctv[j]);
                        break;
                    }
                }
            }
            if(s[i].v > v && s[i].a >= 0)
            {
                if(cctv[m] > s[i].d)
                {
                    ans++;
                    used.insert(cctv[m]);
                }
            }
            if(s[i].v < v && s[i].a > 0)
            {
                if(cctv[m] > s[i].ot)
                {
                    ans++;
                    used.insert(cctv[m]);
                }
            }
        }
        ans1 = m - used.size();
        cout << ans << " " << ans1 << "\n";
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
